package com.huashi.dealer.core.handler;

import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.MappedTypes;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * JSON字符串类型处理器
 * 专门处理JSON字符串字段，避免自动转义
 * 
 * @author 谭陈强
 * @since 2025-01-30
 */
@MappedJdbcTypes({JdbcType.VARCHAR, JdbcType.LONGVARCHAR, JdbcType.CLOB})
@MappedTypes(String.class)
public class JsonStringTypeHandler extends BaseTypeHandler<String> {

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
        // 直接存储原始JSON字符串，不进行转义
        ps.setString(i, parameter);
    }

    @Override
    public String getNullableResult(ResultSet rs, String columnName) throws SQLException {
        String content = rs.getString(columnName);
        // 如果数据库中的内容是转义的JSON，则进行反转义
        return unescapeJson(content);
    }

    @Override
    public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        String content = rs.getString(columnIndex);
        // 如果数据库中的内容是转义的JSON，则进行反转义
        return unescapeJson(content);
    }

    @Override
    public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        String content = cs.getString(columnIndex);
        // 如果数据库中的内容是转义的JSON，则进行反转义
        return unescapeJson(content);
    }

    /**
     * JSON反转义
     * 将转义的JSON字符串转换回原始格式
     */
    private String unescapeJson(String content) {
        if (content == null || content.isEmpty()) {
            return content;
        }
        
        // 如果内容包含转义的双引号，则进行反转义
        if (content.contains("\\\"")) {
            return content.replace("\\\"", "\"");
        }
        
        return content;
    }
}
